package com.winter.common.constant;

import com.winter.common.dto.BaseResponse;
import com.winter.common.exception.BaseException;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;

/**
 * @author zhangshuaiyin
 * @date 2021/5/31 21:58
 */
@Getter
@AllArgsConstructor
public enum BaseMessage {
    /**
     * 成功
     */
    SUCCESS("200", "success"),
    /**
     * 系统异常
     */
    SYSTEM_ERROR("999999", "系统异常, 请联系管理员"),
    INVALID_PARAM("100001", "报文参数校验不通过"),
    HTTP_REQUEST_METHOD_ERROR("1000002", "报文参数校验不通过"),

    /**
     * 用户登录异常
     */
    USER_NAME_PASSWORD_ERROR("A00000", "用户名或密码错误"),
    USER_NAME_ERROR("A00001", "用户名错误"),
    PASSWORD_ERROR("A00002", "密码错误"),
    ;

    /**
     * 错误代码
     */
    private final String code;
    /**
     * 错误信息
     */
    private final String message;

    /**
     * 错误码映射枚举对象
     *
     * @param errorCode 错误代码
     * @return 枚举对象
     */
    public static BaseMessage of(String errorCode) {
        return Arrays.stream(BaseMessage.values())
                .filter(code -> code.equalsWith(errorCode))
                .findFirst()
                .orElse(null);
    }

    /**
     * 错误代码
     *
     * @param errorCode 错误代码
     * @return 是否存在错误代码
     */
    public boolean equalsWith(String errorCode) {
        return this.getCode().equals(errorCode);
    }

    /**
     * 获取错误异常
     *
     * @return 错误异常
     */
    public BaseException exception() {
        return new BaseException(this.getCode(), this.getMessage());
    }

    /**
     * 获取响应对象
     *
     * @return 响应对象
     */
    public BaseResponse<BaseMessage> response() {
        return BaseResponse.of(this.getCode(), this.getMessage());
    }

    /**
     * 获取响应对象
     *
     * @return 响应对象
     */
    public <T> BaseResponse<T> response(T data) {
        return BaseResponse.of(this.getCode(), this.getMessage(), data);
    }
}
